<?php namespace Home\Controller;

use Hdphp\Controller\Controller;

class ListController extends Controller{
	
	private $cateModel;
	
	public function __construct(){
		parent::__construct();
		$this->cateModel = new \Common\Model\Cate; 
	}
	
	
	public function index(){
		//获得分类数据 显示在列表页左侧
		$cateData = $this->cateModel->where("pid = 0")->get();
		$data = array();
		foreach ($cateData as $k => $v) {
			foreach ($this->cateModel->where("pid={$v['cid']}")->get() as $key => $value) {
				$data [] = $value;
			}
		}
		foreach ($data as $k => $v) {
			$data[$k]['son'] = $this->cateModel->where("pid={$v['cid']}")->get();
		}
		View::with('catedata',$data);
		$goodsModel = new \Common\Model\Goods;
		
		
		//获得传过来的cid
		if(Q('get.cid',0,'intval')){
			//一。获得分类对应的商品的属性
			//获得cid
			$cid = Q('get.cid',0,'intval');
			//获得子分类的cid
			$cidson = $this->cateModel->getSon($this->cateModel->get(),$cid);
			//把获得的cid加进数组
			$cidson [] = $cid;
			//把数组转为字符串
			$cidstr = implode(',', $cidson);
			//组合sql语句
			$caetsql = "category_cid IN (".$cidstr.")";
			//通过cid找到属于该分类的商品的gid
			$gids = $goodsModel->where($caetsql)->lists('gid');
			if($gids){
			//通过gid找到商品属性
			//把gid数组转为字符串 组合sql语句
			$gidstr = implode(',', $gids);
			//组合sql语句
			$gasql = "goods_gid IN (".$gidstr.")";
			//获得商品属性数组 并按gavalue分组
			$goodsAttr = Db::table('goods_attr')->where($gasql)->groupBy('gavalue')->get();
			$sametemp = array();
			foreach ($goodsAttr as $v) {
				$sametemp[$v['type_attribute_taid']][] =$v;
			}
			$attr = array();
			//重组数组为array('name'=>'名称',value=>名称对应的值)
			foreach ($sametemp as $taid => $v) {
				if(Db::table('type_attribute')->where("taid={$taid}")->pluck('atype') == '1')continue;
				$attr[] = array(
					'name'=>Db::table('type_attribute')->where("taid={$taid}")->pluck('taname'),
					'value'=>$v
				);
			}
			View::with('attr',$attr);
			//根据属性筛选商品
			//1.处理param参数
			//获得属性的数量
			$num = count($attr);
			//检查是否有$GET['param']参数 如果有 转为数组 如果没有就往数组填充0 
			$param = isset($_GET['param'])?explode('_', $_GET['param']) : array_fill(0, $num, 0);
			//分配到也弥散上
			View::with('param',$param);
			//调用filter方法  取得最终的gid
			$finalGids = $this->filter($param,$gids);
			//如果finalgids为真 就代表有商品 
			if($finalGids){
				//把数组转为字符串 用于组合sql语句
				$finalGidstr = implode(',', $finalGids);
				//取得筛选后的商品
				$goodsData = $goodsModel->where("gid in (".$finalGidstr.")")->get();
				//再遍历商品数组  加上品牌名
				foreach ($goodsData as $k => $v) {
				$goodsData[$k]['brand_name'] = Db::table('brand')
												->where("bid={$v['brand_bid']}")
												->pluck('bname');
				}
			//如果finalgids为假 就代表没有商品 就声明$goodsData为空数组
			} else {
				$goodsData=array();
			}
//			如果该分类没有商品，直接返回空数组到页面循环
			}else{
//				如果没有查询到商品就输出空array()商品;
				$goodsData=array();
			}
		}

		//获得打折商品
		if(Q('get.sid',0,'intval')){
			//获得打折的商品
			$goodsData = $goodsModel->where("sale_status=2")->get();
			//如果有商品的话
			if($goodsData){
				//遍历数组 给数组加上品牌名
				foreach ($goodsData as $k => $v) {
					$goodsData[$k]['brand_name'] = Db::table('brand')
													->where("bid={$v['brand_bid']}")
													->pluck('bname');
				}
			//如果没有商品 定义$goodsData数组为空 一遍页面遍历出错
			} else {
				$goodsData = array();
			}
		}


		//如果传过来的是bid
		if(Q('get.bid',0,'intval')){
			//获得bid
			$bid = Q('get.bid',0,'intval');
			//获得该品牌的所有商品
			$goodsData = $goodsModel->where("brand_bid={$bid}")->get();
			//如果该品牌下有商品的话
			if($goodsData){
				//遍历数组 给数组加上品牌名
				foreach ($goodsData as $k => $v) {
					$goodsData[$k]['brand_name'] = Db::table('brand')
													->where("bid={$bid}")
													->pluck('bname');
				}
			//如果该品牌下没有商品的话  声明一个空数组  分配到页面上循环 以免报错
			} else {
				$goodsData = array();
			}
		}
		//分配数据
		View::with('goodsData',$goodsData);
		//载入页面
		View::make();
	}
	
	//根据选择的商品属性组合  找到最终的商品id
	private function filter($param,$cidGids){
		//先声明一个空数组 用于存gid
		$gids = array();
		//遍历选择的商品属性组合数组
		foreach ($param as  $gaid) {
			//不为0的时候 也就是不是“不限的时候”
			if($gaid){
				//先通过商品属性id gaid拿到商品属性名称
				$gavalue = Db::table('goods_attr')->where("gaid={$gaid}")->pluck('gavalue');
				//在查找有该商品属性名称的商品的gid 压到$gids数组
				$gids[] = Db::table('goods_attr')->where("gavalue='{$gavalue}'")->lists('goods_gid');
			}
		}
		//如果$gids数组为真
		if($gids){
			//先取得$gids的第一个子数组 用来跟其他子数组取得交集
			$temp = $gids[0];
			//遍历$gids数组
			foreach ($gids as $v) {
				//第一次遍历为第0号数组跟自己取交集 然后把交集赋回给$temp
				$temp = array_intersect($temp, $v);
			}
			//最终有选择的属性的商品的gid就等于上面取得的交集与传入的$cidGids取最后一次交集
			$finalGids = array_intersect($temp, $cidGids);
			//如果$gids为假
		} else {
			//最终的gid就等于传入的$cidGids
			$finalGids = $cidGids;
		}
		//最后把$finalGids返出去
		return $finalGids;
	}
	
	
}

 ?>